#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <netdb.h>   /* gethostbyname() necesita esta cabecera */
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>

#define MAXDATASIZE 100
#define CARAC_IP 15 
#define BACKLOG 10


struct informacionEnvio{
	char info[MAXDATASIZE];
	char flag_env[3];
};




  
/* El número máximo de datos en bytes */

int main(int argc, char *argv[])
{
	
	int fd, numbytes,cod;    /* ficheros descriptores */   
   	char buf[MAXDATASIZE];  /* en donde es almacenará el texto recibido */
	char flag_envio[3];
	char ip_servidor[CARAC_IP+1];
	int num_puerto_servidor, flag;
	char nombreoip[50];
	char comparacion[MAXDATASIZE]="0";
	struct informacionEnvio inf;
	struct hostent *he;/* estructura que recibirá información sobre el nodo remoto */
	
	struct sockaddr_in servidor;  /* información sobre la dirección del servidor */
	
	/*RECEPCIÓN DE PARÁMETROS*/	
	if(argc!=4&&argc!=5){
		printf("no se cargaron los suficientes parámetros\n");
		return 0;	
	}
	int tam_ip=strlen(argv[1]);
	if(tam_ip<16&&tam_ip>=7){
		strcpy(ip_servidor,argv[1]);
	}
	else{ printf("Error en la ip del servidor\n"); return 0;}
	num_puerto_servidor=atoi(argv[2]);
	
	if(argc==5){
		
		flag=1;
		strcpy(nombreoip,argv[4]);
	}
	else{ 
		flag=0;
		strcpy(nombreoip,argv[3]);
	}
	
/***TERMINÓ LA CARGA DE DATOS***/
	if ((he=gethostbyname(argv[1]))==NULL){       
	      /* llamada a gethostbyname() */
		printf("gethostbyname() error\n");
		return 0;
   	}

   if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){  
      /* llamada a socket() */
      printf("socket() error\n");
      return 0;
   }
	
	memset(&servidor,0,sizeof(struct sockaddr));
  	servidor.sin_family = AF_INET;
  	servidor.sin_port = htons(num_puerto_servidor); 
   
  	inet_aton(ip_servidor, &servidor.sin_addr);
   

   	if(connect(fd, (struct sockaddr *)&servidor,
     		sizeof(struct sockaddr))==-1){ 
		/* llamada a connect() */
		printf("connect() error\n");
		return 0;
	}

/***LE VOY A ENVIAR EL FLAG***/
	char infoRecivida[MAXDATASIZE];
	switch(flag){
	case 0:
		strcpy(inf.flag_env,"0");
		strcpy(inf.info,nombreoip);
		cod=write(fd,&inf,sizeof(inf));
		if(cod<0)
			perror("No he podido escribir el mensaje");
		break;
	case 1:
		strcpy(inf.flag_env,"1");
		strcpy(inf.info,nombreoip);
		cod=write(fd,&inf,sizeof(inf));
		break;
	}
	
	cod=read(fd,&infoRecivida,sizeof(infoRecivida));
	if(cod<0)
		perror("No he podido leer el mensaje");
	if(infoRecivida==NULL){
		printf("Consulta no exitosa\n");
		return -1;
	}
	else{	
		if(!strcmp(infoRecivida,comparacion))
			printf("%s no encontrado.\n",nombreoip);
		else
			printf("\n%s -> %s\n\n",nombreoip, infoRecivida);
	}
	
 
	close(fd);   
	return 0;

}


